home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Games / Doom / ADoom-0.8 / ADoom_src / c2p_020_cmp.s < prev    next >
Text File  |  1998-06-24  |  22KB  |  837 lines

  1.         mc68020
  2.         multipass
  3.     if (_eval(DEBUG)&$8000)
  4.         debug    on,lattice4
  5.     endc
  6.  
  7. ; ---------------------------------------------------------------------
  8.  
  9. ; void __asm c2p8 (register __a2 UBYTE *fBUFFER,
  10. ;                  register __a3 UBYTE *fBUFFER_CMP,
  11. ;                  register __a4 PLANEPTR *planes,
  12. ;                  register __d0 ULONG signals1,
  13. ;                  register __d1 ULONG signals2,
  14. ;                  register __d2 ULONG pixels,     // width*height
  15. ;                  register __d3 ULONG offset,     // byte offset into plane
  16. ;                  register __a6 struct GfxBase *GfxBase,
  17. ;                  register __a5 UBYTE *xlate,
  18. ;                  register __d4 UWORD force_update);
  19. ;
  20. ; Pipelined CPU+blitter 8-plane chunky to planar converter.
  21. ; Optimised for 68020/30 with fastmem.
  22. ;
  23. ; Author: Peter McGavin (e-mail peterm@maths.grace.cri.nz), 21 April 1994
  24. ; Based on James McCoull's 4-pass blitter algorithm.
  25. ;
  26. ; This code is public domain.
  27. ;
  28. ; Use chunky comparison buffer.  Return immediately if no diffs found.
  29. ; Perform first 2 passes (Fast->Chip) with the CPU (in 1 pass).
  30. ; Only convert 32-pixel "units" that changed since last time.
  31. ; Update chunky comparison buffer.
  32. ; If nothing has changed, signal signals1 and return immediately.
  33. ; Wait for previous QBlit() to completely finish (signals2).
  34. ; Then launch passes 3 & 4 with QBlit().
  35. ; Return immediately after launching passes 3 & 4.
  36. ; Signal signals1 (asynchronously) after completion of pass 3.
  37. ; Signal signals2 from CleanUp() on completion of QBlit().
  38. ; Calling task must wait for signals1 before next call to c2p8().
  39. ;
  40. ; Approx timing (A4000/030, 320x200x8):
  41. ;    CPU pass min 13ms, max 37ms, depending how different (then return)
  42. ;    Asynchronous blitter passes add 62ms
  43. ;    Max framerate (with changes every frame) is 62ms/frame = 16fps
  44. ;        occurs when fBUFFER rendering time <= 25ms (= 62ms-37ms)
  45. ;
  46. ; (Unimplemented speedup idea: remember locations of the first and last
  47. ; differences, then blit only the parts that have changed.)
  48. ;
  49. ; (Another unimplemented speedup idea: use a "scrambled" chunky buffer.
  50. ; Skip pass 1.)
  51. ;
  52. ; Example usage:
  53. ;
  54. ;    /* clear fBUFFER, fBUFFER_CMP, and planes here */
  55. ;    if ((sigbit1 = AllocSignal(-1)) == -1 ||
  56. ;        (sigbit2 = AllocSignal(-1)) == -1)
  57. ;        die ("Can't allocate signal!\n");
  58. ;    SetSignal ((1<<sigbit1)|(1<<sigbit2),  // initial state is "finished"
  59. ;           (1<<sigbit1)|(1<<sigbit2));
  60. ;    for (;;) {
  61. ;        /* render to fBUFFER here */
  62. ;        Wait (1<<sigbit1);  // wait for prev c2p8() to finish pass 3
  63. ;            c2p8 (fBUFFER, fBUFFER_CMP, &RASTPORT->BitMap->Planes[0],
  64. ;              1<<sigbit1, 1<<sigbit2, WIDTH*HEIGHT,
  65. ;                     WIDTH/8*LINESTOSKIP, GfxBase);
  66. ;    }
  67. ;    Wait (1<<sigbit1);  // wait for last c2p8 to finish pass 3
  68. ;    Wait (1<<sigbit2);  // wait for last c2p8 to completely finish
  69. ;    FreeSignal(sigbit1);
  70. ;    FreeSignal(sigbit2);
  71. ;
  72. ; ---------------------------------------------------------------------
  73.  
  74. maxwidth    equ    320    ; must be a multiple of 32
  75. maxheight    equ    200
  76. maxpixels    equ    maxwidth*maxheight
  77.  
  78. cleanup        equ    $40
  79.  
  80. merge        macro    ; \1 data1, \2 data2, \3=shift \4=mask, \5 temp
  81.         move.l    \2,\5
  82.         lsr.l    #\3,\5
  83.         eor.l    \1,\5
  84.         and.l    \4,\5
  85.         eor.l    \5,\1
  86.         lsl.l    #\3,\5
  87.         eor.l    \5,\2
  88.         endm
  89.  
  90. xload        macro    ; translate 4 8-bit pixels to 6-bit EHB using xlate[]
  91.         move.b    (\1-16,a2),d4
  92.         move.b    (a6,d4.w),\2
  93.         lsl.w    #8,\2
  94.         move.b    (\1-16+8,a2),d4
  95.         move.b    (a6,d4.w),\2
  96.         swap    \2
  97.         move.b    (\1-16+2,a2),d4
  98.         move.b    (a6,d4.w),\2
  99.         lsl.w    #8,\2
  100.         move.b    (\1-16+10,a2),d4
  101.         move.b    (a6,d4.w),\2
  102.         endm
  103.  
  104. ;        section chunks,code
  105.  
  106.     ifeq    depth-8
  107.         xdef    _c2p_8_020
  108. _c2p_8_020:
  109.     else
  110.     ifeq    depth-6
  111.         xdef    _c2p_6_020
  112. _c2p_6_020:
  113.     else
  114.         fail    "unsupported depth!"
  115.     endc
  116.     endc
  117.         movem.l    d2-d7/a2-a6,-(sp)
  118.  
  119. ; save arguments
  120.  
  121.         move.l    #mybltnode,a0
  122.         move.l    a2,(chunky-mybltnode,a0)
  123.         move.l    a4,(planes-mybltnode,a0)
  124.         move.l    d0,(signals1-mybltnode,a0)
  125.         move.l    d1,(signals2-mybltnode,a0)
  126.         move.l    d2,(pixels-mybltnode,a0)
  127.         lsr.l    #1,d2
  128.         move.l    d2,(pixels2-mybltnode,a0)
  129.         lsr.l    #1,d2
  130.         move.l    d2,(pixels4-mybltnode,a0)
  131.         lsr.l    #1,d2
  132.         move.l    d2,(pixels8-mybltnode,a0)
  133.         lsr.l    #1,d2
  134.         move.l    d2,(pixels16-mybltnode,a0)
  135.         move.l    d3,(offset-mybltnode,a0)
  136.         move.l    a6,(gfxbase-mybltnode,a0)
  137.     IFLE depth-6
  138.         move.l    a5,(xlate-mybltnode,a0)
  139.         move.w    d4,(force_update-mybltnode,a0)
  140.     ENDC
  141.  
  142. ;-------------------------------------------------
  143. ;original chunky data
  144. ;0        a7a6a5a4a3a2a1a0 b7b6b5b4b3b2b1b0
  145. ;2        c7c6c5c4c3c2c1c0 d7d6d5d4d3d2d1d0
  146. ;4        e7e6e5e4e3e2e1e0 f7f6f5f4f3f2f1f0
  147. ;6        g7g6g5g4g3g2g1g0 h7h6h5h4h3h2h1h0
  148. ;8        i7i6i5i4i3i2i1i0 j7j6j5j4j3j2j1j0
  149. ;10        k7k6k5k4k3k2k1k0 l7l6l5l4l3l2l1l0
  150. ;12        m7m6m5m4m3m2m1m0 n7n6n5n4n3n2n1n0
  151. ;14        o7o6o5o4o3o2o1o0 p7p6p5p4p3p2p1p0
  152. ;16        q7q6q5q4q3q2q1q0 r7r6r5r4r3r2r1r0
  153. ;18        s7s6s5s4s3s2s1s0 t7t6t5t4t3t2t1t0
  154. ;20        u7u6u5u4u3u2u1u0 v7v6v5v4v3v2v1v0
  155. ;22        w7w6w5w4w3w2w1w0 x7x6x5x4x3x2x1x0
  156. ;24        y7y6y5y4y3y2y1y0 z7z6z5z4z3z2z1z0
  157. ;26        A7A6A5A4A3A2A1A0 B7B6B5B4B3B2B1B0
  158. ;28        C7C6C5C4C3C2C1C0 D7D6D5D4D3D2D1D0
  159. ;30        E7E6E5E4E3E2E1E0 F7F6F5F4F3F2F1F0
  160. ;-------------------------------------------------
  161.  
  162.         move.l    (pixels16-mybltnode,a0),d6
  163.         lsr.l    #1,d6        ; loop count = pixels/32
  164.  
  165.     IFLE depth-6
  166.         move.l    (xlate-mybltnode,a0),a6    ; a6 -> xlate
  167.     ENDC
  168.  
  169.         move.l    (pixels4-mybltnode,a0),d0
  170.         move.l    #buff2,a0    ; a0 -> buff2 (in Chip)
  171.         lea    (a0,d0.l),a1    ; a1 -> buff2+pixels/4
  172.         lea    (a1,d0.l),a4    ; a4 -> buff2+pixels/2
  173.         lea    (a4,d0.l),a5    ; a5 -> buff2+3*pixels/4
  174.  
  175.         move.l    #$0f0f0f0f,d7    ; constant
  176.         move.l    #$00ff00ff,d5    ; constant
  177.  
  178.         bra.b    end_pass1loop
  179.  
  180.         cnop    0,4
  181.  
  182. ; main loop (starts here) processes 32 chunky pixels at a time
  183. ; compare next 32 pixels with compare page, looking for differences
  184.  
  185. initpass1loop:
  186.     IFLE depth-6
  187.         tst.w    (force_update)    ; force_update?
  188.         bne    go_c2p
  189.     ENDC
  190.         cmpm.l    (a2)+,(a3)+
  191.         bne    fix1
  192.         cmpm.l    (a2)+,(a3)+
  193.         bne    fix2
  194.         cmpm.l    (a2)+,(a3)+
  195.         bne    fix3
  196.         cmpm.l    (a2)+,(a3)+
  197.         bne    fix4
  198.         cmpm.l    (a2)+,(a3)+
  199.         bne    fix5
  200.         cmpm.l    (a2)+,(a3)+
  201.         bne    fix6
  202.         cmpm.l    (a2)+,(a3)+
  203.         bne    fix7
  204.         cmpm.l    (a2)+,(a3)+
  205.         bne    fix8
  206.  
  207.         addq.l    #8,a0        ; skip 8 bytes in output
  208.         addq.l    #8,a1        ; skip 8 bytes in output
  209.         addq.l    #8,a4        ; skip 8 bytes in output
  210.         addq.l    #8,a5        ; skip 8 bytes in output
  211.  
  212. end_pass1loop:    dbra    d6,initpass1loop
  213.  
  214.         bra    done2
  215.  
  216.         cnop    0,4
  217.  
  218. ; This becomes the main loop after the first difference is found
  219.  
  220. pass1loop:
  221.     IFLE depth-6
  222.         tst.w    (force_update)    ; force_update?
  223.         bne    go_c2p
  224.     ENDC
  225.         cmpm.l    (a2)+,(a3)+
  226.         bne    fix1
  227.         cmpm.l    (a2)+,(a3)+
  228.         bne    fix2
  229.         cmpm.l    (a2)+,(a3)+
  230.         bne    fix3
  231.         cmpm.l    (a2)+,(a3)+
  232.         bne    fix4
  233.         cmpm.l    (a2)+,(a3)+
  234.         bne    fix5
  235.         cmpm.l    (a2)+,(a3)+
  236.         bne    fix6
  237.         cmpm.l    (a2)+,(a3)+
  238.         bne    fix7
  239.         cmpm.l    (a2)+,(a3)+
  240.         bne    fix8
  241.  
  242.         addq.l    #8,a0        ; skip 8 bytes in output
  243.         addq.l    #8,a1        ; skip 8 bytes in output
  244.         addq.l    #8,a4        ; skip 8 bytes in output
  245.         addq.l    #8,a5        ; skip 8 bytes in output
  246.  
  247.         dbra    d6,pass1loop
  248.  
  249.         bra    done
  250.  
  251. ; difference found, restore a2 and a3
  252.  
  253. fix8:        sub.w    #32,a2
  254.         sub.w    #32,a3
  255.         bra.b    go_c2p
  256.  
  257. fix7:        sub.w    #28,a2
  258.         sub.w    #28,a3
  259.         bra.b    go_c2p
  260.  
  261. fix6:        sub.w    #24,a2
  262.         sub.w    #24,a3
  263.         bra.b    go_c2p
  264.  
  265. fix5:        sub.w    #20,a2
  266.         sub.w    #20,a3
  267.         bra.b    go_c2p
  268.  
  269. fix4:        sub.w    #16,a2
  270.         sub.w    #16,a3
  271.         bra.b    go_c2p
  272.  
  273. fix3:        subq.l    #4,a2
  274.         subq.l    #4,a3
  275. fix2:        subq.l    #4,a2
  276.         subq.l    #4,a3
  277. fix1:        subq.l    #4,a2
  278.         subq.l    #4,a3
  279.  
  280. ; convert 32 pixels (passes 1 and 2 combined)
  281.  
  282. go_c2p:        movem.l    (a2)+,d0-d3    ; AaBbCcDd EeFfGgHh IiJjKkLl MmNnOoPp
  283.  
  284.         movem.l    d0-d3,(a3)    ; update compare buffer
  285.         adda.w    #16,a3
  286.  
  287.     IFGT depth-6
  288.         merge    d0,d2,8,d5,d4    ; d0=AaIiCcKk d2=BbJjDdLl
  289.         merge    d1,d3,8,d5,d4    ; d1=EeMmGgOo d3=FfNnHhPp
  290.     ELSE
  291.         moveq    #0,d4
  292.         xload    0,d0        ; d0=xlate[AaIiCcKk]
  293.         xload    4,d1        ; d1=xlate[EeMmGgOo]
  294.         xload    1,d2        ; d2=xlate[BbJjDdLl]
  295.         xload    5,d3        ; d3=xlate[FfNnHhPp]
  296.     ENDC
  297.         move.l    d1,d4
  298.         lsr.l    #4,d4
  299.         eor.l    d0,d4
  300.         and.l    d7,d4
  301.         eor.l    d4,d0        ; d0=AEIMCGKO
  302.  
  303.         move.l    d0,(a0)+
  304.  
  305.         lsl.l    #4,d4
  306.         eor.l    d4,d1        ; d1=aeimcgko
  307.         move.l    d3,d4
  308.         lsr.l    #4,d4
  309.  
  310.         move.l    d1,(a4)+
  311.  
  312.         eor.l    d2,d4
  313.         and.l    d7,d4
  314.         eor.l    d4,d2        ; d2=BFJNDHLP
  315.  
  316.         move.l    d2,(a1)+
  317.  
  318.         lsl.l    #4,d4
  319.         eor.l    d4,d3        ; d3=bfjndhlp
  320.  
  321.         move.l    d3,(a5)+
  322.  
  323.         bchg    #16,d6        ; repeat inner loop twice
  324.         beq    go_c2p
  325.  
  326.         dbra    d6,pass1loop
  327.  
  328. ; wait until previous QBlit() has completely finished (signals2)
  329. ; then start the blitter in the background for passes 3 & 4
  330.  
  331. done:        move.l    #mybltnode,a2    ; a2->mybltnode
  332.         move.l    (4).w,a6    ; a6->SysBase
  333.         move.l    (ThisTask,a6),(task-mybltnode,a2) ; save task ptr
  334.         move.l    (signals2-mybltnode,a2),d0
  335.         jsr    (_LVOWait,a6)
  336.  
  337.         move.l    a2,a1
  338.         move.l    (gfxbase-mybltnode,a2),a6
  339.         jsr    (_LVOQBlit,a6)
  340.  
  341.         bra    ret
  342.  
  343.  
  344. ; If we get to here then no difference was found.
  345. ; Signal the task (signals1) and return.
  346.  
  347. done2:        move.l    #mybltnode,a2
  348.         move.l    (signals1-mybltnode,a2),d0
  349.         move.l    d0,d1
  350.         move.l    (4).w,a6    ; a6->SysBase
  351.         jsr    (_LVOSetSignal,a6)
  352.  
  353. ret:        movem.l    (sp)+,d2-d7/a2-a6
  354.         rts
  355.  
  356. ;-----------------------------------------------------------------------------
  357. ; QBlit functions (called asynchronously)
  358.  
  359. ;-------------------------------------------------
  360. ;buff2 after pass 2
  361. ;0        a7a6a5a4e7e6e5e4 i7i6i5i4m7m6m5m4
  362. ;2        c7c6c5c4g7g6g5g4 k7k6k5k4o7o6o5o4
  363. ;4        q7q6q5q4u7u6u5u4 y7y6y5y4C7C6C5C4
  364. ;6        s7s6s5s4w7w6w5w4 A7A6A5A4E7E6E5E4
  365. ;
  366. ;Pixels/4+0    b7b6b5b4f7f6f5f4 j7j6j5j4n7n6n5n4
  367. ;Pixels/4+2    d7d6d5d4h7h6h5h4 l7l6l5l4p7p6p5p4
  368. ;Pixels/4+4    r7r6r5r4v7v6v5v4 z7z6z5z4D7D6D5D4
  369. ;Pixels/4+6    t7t6t5t4x7x6x5x4 B7B6B5B4F7F6F5F4
  370. ;
  371. ;Pixels/2+0    a3a2a1a0e3e2e1e0 i3i2i1i0m3m2m1m0
  372. ;Pixels/2+2    c3c2c1c0g3g2g1g0 k3k2k1k0o3o2o1o0
  373. ;Pixels/2+4    q3q2q1q0u3u2u1u0 y3y2y1y0C3C2C1C0
  374. ;Pixels/2+6    s3s2s1s0w3w2w1w0 A3A2A1A0E3E2E1E0
  375. ;
  376. ;3*Pixels/4+0    b3b2b1b0f3f2f1f0 j3j2j1j0n3n2n1n0    
  377. ;3*Pixels/4+2    d3d2d1d0h3h2h1h0 l3l2l1l0p3p2p1p0
  378. ;3*Pixels/4+4    r3r2r1r0v3v2v1v0 z3z2z1z0D3D2D1D0
  379. ;3*Pixels/4+6    t3t2t1t0x3x2x1x0 B3B2B1B0F3F2F1F0
  380. ;-------------------------------------------------
  381.  
  382. ;Pass 3, subpass 1
  383. ;    apt        Buff2
  384. ;    bpt        Buff2+2
  385. ;    dpt        Buff3
  386. ;    amod        2
  387. ;    bmod        2
  388. ;    dmod        0
  389. ;    cdat        $cccc
  390. ;    sizv        Pixels/4
  391. ;    sizh        1 word
  392. ;    con        D=AC+(B>>2)~C, ascending
  393.  
  394. blit31:        moveq    #-1,d0
  395.         move.l    d0,(bltafwm,a0)
  396.         move.w    #0,(bltdmod,a0)
  397.         move.l    #buff2,(bltapt,a0)
  398.         move.l    #buff2+2,(bltbpt,a0)
  399.         move.l    #buff3,(bltdpt,a0)
  400.         move.w    #2,(bltamod,a0)            ; 2
  401.         move.w    #2,(bltbmod,a0)            ; 2
  402.         move.w    (pixels4+2-mybltnode,a1),(bltsizv,a0)    ; pixels/4
  403.         move.w    #$cccc,(bltcdat,a0)
  404.         move.l    #$0DE42000,(bltcon0,a0)    ; D=AC+(B>>2)~C
  405.         move.w    #1,(bltsizh,a0)        ;do blit
  406.         lea    (blit32,pc),a0
  407.         move.l    a0,(qblitfunc-mybltnode,a1)
  408.         rts
  409.  
  410. ;Pass 3, subpass 2
  411. ;    apt        Buff2+Pixels-2-2
  412. ;    bpt        Buff2+Pixels-2
  413. ;    dpt        Buff3+Pixels-2
  414. ;    amod        2
  415. ;    bmod        2
  416. ;    dmod        0
  417. ;    cdat        $cccc
  418. ;    sizv        Pixels/4
  419. ;    sizh        1 word
  420. ;    con        D=(A<<2)C+B~C, descending
  421.  
  422. blit32:        move.l    #buff2,d0
  423.         add.l    (pixels-mybltnode,a1),d0
  424.         subq.l    #2+2,d0
  425.         move.l    d0,(bltapt,a0)        ; buff2+pixels-2-2
  426.         addq.l    #2,d0
  427.         move.l    d0,(bltbpt,a0)        ; buff2+pixels-2
  428.         add.l    #buff3-buff2,d0
  429.         move.l    d0,(bltdpt,a0)        ; buff3+pixels-2
  430.         move.l    #$2DE40002,(bltcon0,a0)    ; D=(A<<2)C+B~C, desc.
  431.         move.w    #1,(bltsizh,a0)        ;do blit
  432.     IFGT depth-6
  433.         lea    (blit47,pc),a0
  434.     ELSE
  435.         lea    (blit43,pc),a0
  436.     ENDC
  437.         move.l    a0,(qblitfunc-mybltnode,a1)
  438.         rts
  439.  
  440. ;-------------------------------------------------
  441. ;buff3 after pass 3
  442. ;0        a7a6c7c6e7e6g7g6 i7i6k7k6m7m6o7o6
  443. ;2        q7q6s7s6u7u6w7w6 y7y6A7A6C7C6E7E6
  444. ;
  445. ;Pixels/8+0    b7b6d7d6f7f6h7h6 j7j6l7l6n7n6p7p6
  446. ;Pixels/8+2    r7r6t7t6v7v6x7x6 z7z6B7B6D7D6F7F6
  447. ;
  448. ;Pixels/4+0    a3a2c3c2e3e2g3g2 i3i2k3k2m3m2o3o2
  449. ;Pixels/4+2    q3q2s3s2u3u2w3w2 y3y2A3A2C3C2E3E2
  450. ;
  451. ;3*Pixels/8+0    b3b2d3d2f3f2h3h2 j3j2l3l2n3n2p3p2
  452. ;3*Pixels/8+2    r3r2t3t2v3v2x3x2 z3z2B3B2D3D2F3F2
  453. ;
  454. ;Pixels/2+0    a5a4c5c4e5e4g5g4 i5i4k5k4m5m4o5o4
  455. ;Pixels/2+2    q5q4s5s4u5u4w5w4 y5y4A5A4C5C4E5E4
  456. ;
  457. ;5*Pixels/8+0    b5b4d5d4f5f4h5h4 j5j4l5l4n5n4p5p4
  458. ;5*Pixels/8+2    r5r4t5t4v5v4x5x4 z5z4B5B4D5D4F5F4
  459. ;
  460. ;3*Pixels/4+0    a1a0c1c0e1e0g1g0 i1i0k1k0m1m0o1o0
  461. ;3*Pixels/4+2    q1q0s1s0u1u0w1w0 y1y0A1A0C1C0E1E0
  462. ;
  463. ;7*Pixels/8+0    b1b0d1d0f1f0h1h0 j1j0l1l0n1n0p1p0
  464. ;7*Pixels/8+2    r1r0t1t0v1v0x1x0 z1z0B1B0D1D0F1F0
  465. ;-------------------------------------------------
  466.  
  467.     IFGT depth-6
  468.  
  469. ;Pass 4, plane 7
  470. ;    apt        Buff3+0*pixels/8
  471. ;    bpt        Buff3+1*pixels/8
  472. ;    dpt        Plane7+offset
  473. ;    amod        0
  474. ;    bmod        0
  475. ;    dmod        0
  476. ;    cdat        $aaaa
  477. ;    sizv        Pixels/16
  478. ;    sizh        1 word
  479. ;    con        D=AC+(B>>1)~C, ascending
  480.  
  481. blit47:        movem.l    a2,-(sp)
  482.  
  483.         move.w    #0,(bltamod,a0)
  484.         move.w    #0,(bltbmod,a0)
  485.         move.w    (pixels16+2-mybltnode,a1),(bltsizv,a0)    ; pixels/16
  486.         move.w    #$aaaa,(bltcdat,a0)
  487.         move.l    #$0DE41000,(bltcon0,a0)    ; D=AC+(B>>1)~C
  488.  
  489.         move.l    #buff3,d0
  490.         move.l    d0,(bltapt,a0)        ; buff3+0*pixels/8
  491.         add.l    (pixels8-mybltnode,a1),d0
  492.         move.l    d0,(bltbpt,a0)        ; buff3+1*pixels/8
  493.         move.l    (planes-mybltnode,a1),a2
  494.         move.l    (7*4,a2),d0
  495.         add.l    (offset-mybltnode,a1),d0
  496.         move.l    d0,(bltdpt,a0)        ; Plane7+offset
  497.         move.w    #1,(bltsizh,a0)        ;plane 7
  498.  
  499.         movem.l    a1/a6,-(sp)
  500.         move.l    (signals1-mybltnode,a1),d0
  501.         move.l    (task-mybltnode,a1),a1
  502.         move.l    (4).w,a6        ; a6->SysBase
  503.         jsr    (_LVOSignal,a6)        ; signal pass 3 has finished
  504.         movem.l    (sp)+,a1/a6
  505.  
  506.         lea    (blit43,pc),a0
  507.         move.l    a0,(qblitfunc-mybltnode,a1)
  508.         movem.l    (sp)+,a2
  509.         rts
  510.  
  511. ;-------------------------------------------------
  512. ;Plane7        a7b7c7d7e7f7g7h7 i7j7k7l7m7n7o7p7
  513. ;Plane7+2    q7r7s7t7u7v7w7x7 y7z7A7B7C7D7E7F7
  514. ;-------------------------------------------------
  515.  
  516.     ENDC
  517.  
  518. ;Pass 4, plane 3
  519. ;    apt        buff3+2*pixels/8
  520. ;    bpt        buff3+3*pixels/8
  521. ;    dpt        Plane3+offset
  522. ;    amod        0
  523. ;    bmod        0
  524. ;    dmod        0
  525. ;    cdat        $aaaa
  526. ;    sizv        pixels/16
  527. ;    sizh        1 word
  528. ;    con        D=AC+(B>>1)~C, ascending
  529.  
  530. blit43:        move.l    a2,-(sp)        ; preserve a2
  531.     IFLE depth-6
  532.         move.w    #0,(bltamod,a0)
  533.         move.w    #0,(bltbmod,a0)
  534.         move.w    (pixels16+2-mybltnode,a1),(bltsizv,a0)    ; pixels/16
  535.         move.w    #$aaaa,(bltcdat,a0)
  536.         move.l    #$0DE41000,(bltcon0,a0)    ; D=AC+(B>>1)~C
  537.     ENDC
  538.         move.l    #buff3,d0
  539.         add.l    (pixels4-mybltnode,a1),d0
  540.         move.l    d0,(bltapt,a0)        ; buff3+2*pixels/8
  541.         add.l    (pixels8-mybltnode,a1),d0
  542.         move.l    d0,(bltbpt,a0)        ; buff3+3*pixels/8
  543.         move.l    (planes-mybltnode,a1),a2
  544.         move.l    (3*4,a2),d0
  545.         add.l    (offset-mybltnode,a1),d0
  546.         move.l    d0,(bltdpt,a0)        ; Plane3+offset
  547.         move.w    #1,(bltsizh,a0)        ;plane 3
  548.     IFLE depth-6
  549.         movem.l    a1/a6,-(sp)
  550.         move.l    (signals1-mybltnode,a1),d0
  551.         move.l    (task-mybltnode,a1),a1
  552.         move.l    (4).w,a6        ; a6->SysBase
  553.         jsr    (_LVOSignal,a6)        ; signal pass 3 has finished
  554.         movem.l    (sp)+,a1/a6
  555.     ENDC
  556.         lea    (blit45,pc),a0
  557.         move.l    a0,(qblitfunc-mybltnode,a1)
  558.         move.l    (sp)+,a2        ; restore a2
  559.         rts
  560.  
  561. ;-------------------------------------------------
  562. ;Plane3        a3b3c3d3e3f3g3h3 i3j3k3l3m3n3o3p3
  563. ;Plane3+2    q3r3s3t3u3v3w3x3 y3z3A3B3C3D3E3F3
  564. ;-------------------------------------------------
  565.  
  566. ;Pass 4, plane 5
  567. ;    apt        buff3+4*pixels/8
  568. ;    bpt        buff3+5*pixels/8
  569. ;    dpt        Plane5+offset
  570. ;    amod        0
  571. ;    bmod        0
  572. ;    dmod        0
  573. ;    cdat        $aaaa
  574. ;    sizv        pixels/16
  575. ;    sizh        1 word
  576. ;    con        D=AC+(B>>1)~C, ascending
  577.  
  578. blit45:        move.l    a2,d1            ; preserve a2
  579.         move.l    #buff3,d0
  580.         add.l    (pixels2-mybltnode,a1),d0
  581.         move.l    d0,(bltapt,a0)        ; buff3+4*pixels/8
  582.         add.l    (pixels8-mybltnode,a1),d0
  583.         move.l    d0,(bltbpt,a0)        ; buff3+5*pixels/8
  584.         move.l    (planes-mybltnode,a1),a2
  585.         move.l    (5*4,a2),d0
  586.         add.l    (offset-mybltnode,a1),d0
  587.         move.l    d0,(bltdpt,a0)        ; Plane5+offset
  588.         move.w    #1,(bltsizh,a0)        ;plane 5
  589.         lea    (blit41,pc),a0
  590.         move.l    a0,(qblitfunc-mybltnode,a1)
  591.         move.l    d1,a2            ; restore a2
  592.         rts
  593.  
  594. ;-------------------------------------------------
  595. ;Plane5        a5b5c5d5e5f5g5h5 i5j5k5l5m5n5o5p5
  596. ;Plane5+2    q5r5s5t5u5v5w5x5 y5z5A5B5C5D5E5F5
  597. ;-------------------------------------------------
  598.  
  599. ;Pass 4, plane 1
  600. ;    apt        buff3+6*pixels/8
  601. ;    bpt        buff3+7*pixels/8
  602. ;    dpt        Plane1+offset
  603. ;    amod        0
  604. ;    bmod        0
  605. ;    dmod        0
  606. ;    cdat        $aaaa
  607. ;    sizv        pixels/16
  608. ;    sizh        1 word
  609. ;    con        D=AC+(B>>1)~C, ascending
  610.  
  611. blit41:        move.l    a2,d1            ; preserve a2
  612.         move.l    #buff3,d0
  613.         add.l    (pixels4-mybltnode,a1),d0
  614.         add.l    (pixels2-mybltnode,a1),d0
  615.         move.l    d0,(bltapt,a0)        ; buff3+6*pixels/8
  616.         add.l    (pixels8-mybltnode,a1),d0
  617.         move.l    d0,(bltbpt,a0)        ; buff3+7*pixels/8
  618.         move.l    (planes-mybltnode,a1),a2
  619.         move.l    (1*4,a2),d0
  620.         add.l    (offset-mybltnode,a1),d0
  621.         move.l    d0,(bltdpt,a0)        ; Plane1+offset
  622.         move.w    #1,(bltsizh,a0)        ;plane 1
  623.     IFGT depth-6
  624.         lea    (blit46,pc),a0
  625.     ELSE
  626.         lea    (blit42,pc),a0
  627.     ENDC
  628.         move.l    a0,(qblitfunc-mybltnode,a1)
  629.         move.l    d1,a2            ; restore a2
  630.         rts
  631.  
  632. ;-------------------------------------------------
  633. ;Plane1        a1b1c1d1e1f1g1h1 i1j1k1l1m1n1o1p1
  634. ;Plane1+2    q1r1s1t1u1v1w1x1 y1z1A1B1C1D1E1F1
  635. ;-------------------------------------------------
  636.  
  637.     IFGT depth-6
  638.  
  639. ;Pass 4, plane 6
  640. ;    apt        buff3+1*pixels/8-2
  641. ;    bpt        buff3+2*pixels/8-2
  642. ;    dpt        Plane6+plsiz-2+offset
  643. ;    amod        0
  644. ;    bmod        0
  645. ;    dmod        0
  646. ;    cdat        $aaaa
  647. ;    sizv        pixels/16
  648. ;    sizh        1 word
  649. ;    con        D=(A<<1)C+B~C, descending
  650.  
  651. blit46:        move.l    a2,d1            ; preserve a2
  652.         move.l    #buff3,d0
  653.         add.l    (pixels8-mybltnode,a1),d0
  654.         subq.l    #2,d0
  655.         move.l    d0,(bltapt,a0)        ; buff3+1*pixels/8-2
  656.         add.l    (pixels8-mybltnode,a1),d0
  657.         move.l    d0,(bltbpt,a0)        ; buff3+2*pixels/8-2
  658.         move.l    (planes-mybltnode,a1),a2
  659.         move.l    (6*4,a2),d0
  660.         add.l    (offset-mybltnode,a1),d0
  661.         add.l    (pixels8-mybltnode,a1),d0
  662.         subq.l    #2,d0
  663.         move.l    d0,(bltdpt,a0)        ; Plane6+offset+plsiz-2
  664.         move.l    #$1DE40002,(bltcon0,a0)    ; D=(A<<1)C+B~C, desc.
  665.         move.w    #1,(bltsizh,a0)        ;plane 6
  666.         lea    (blit42,pc),a0
  667.         move.l    a0,(qblitfunc-mybltnode,a1)
  668.         move.l    d1,a2            ; restore a2
  669.         rts
  670.  
  671. ;-------------------------------------------------
  672. ;Plane6        a6b6c6d6e6f6g6h6 i6j6k6l6m6n6o6p6
  673. ;Plane6+2    q6r6s6t6u6v6w6x6 y6z6A6B6C6D6E6F6
  674. ;-------------------------------------------------
  675.  
  676.     ENDC
  677.  
  678. ;Pass 4, plane 2
  679. ;    apt        buff3+3*pixels/8-2
  680. ;    bpt        buff3+4*pixels/8-2
  681. ;    dpt        Plane2+plsiz-2+offset
  682. ;    amod        0
  683. ;    bmod        0
  684. ;    dmod        0
  685. ;    cdat        $aaaa
  686. ;    sizv        pixels/16
  687. ;    sizh        1 word
  688. ;    con        D=(A<<1)C+B~C, descending
  689.  
  690. blit42:        move.l    a2,d1            ; preserve a2
  691.         move.l    #buff3,d0
  692.         add.l    (pixels2-mybltnode,a1),d0
  693.         subq.l    #2,d0
  694.         move.l    d0,(bltbpt,a0)        ; buff3+4*pixels/8-2
  695.         sub.l    (pixels8-mybltnode,a1),d0
  696.         move.l    d0,(bltapt,a0)        ; buff3+3*pixels/8-2
  697.         move.l    (planes-mybltnode,a1),a2
  698.         move.l    (2*4,a2),d0
  699.         add.l    (offset-mybltnode,a1),d0
  700.         add.l    (pixels8-mybltnode,a1),d0
  701.         subq.l    #2,d0
  702.         move.l    d0,(bltdpt,a0)        ; Plane2+offset+plsiz-2
  703.     IFLE depth-6
  704.         move.l    #$1DE40002,(bltcon0,a0)    ; D=(A<<1)C+B~C, desc.
  705.     ENDC
  706.         move.w    #1,(bltsizh,a0)        ;plane 2
  707.         lea    (blit44,pc),a0
  708.         move.l    a0,(qblitfunc-mybltnode,a1)
  709.         move.l    d1,a2            ; restore a2
  710.         rts
  711.  
  712. ;-------------------------------------------------
  713. ;Plane2        a2b2c2d2e2f2g2h2 i2j2k2l2m2n2o2p2
  714. ;Plane2+2    q2r2s2t2u2v2w2x2 y2z2A2B2C2D2E2F2
  715. ;-------------------------------------------------
  716.  
  717. ;Pass 4, plane 4
  718. ;    apt        buff3+5*pixels/8-2
  719. ;    bpt        buff3+6*pixels/8-2
  720. ;    dpt        Plane4+plsiz-2+offset
  721. ;    amod        0
  722. ;    bmod        0
  723. ;    dmod        0
  724. ;    cdat        $aaaa
  725. ;    sizv        pixels/16
  726. ;    sizh        1 word
  727. ;    con        D=(A<<1)C+B~C, descending
  728.  
  729. blit44:        move.l    a2,d1            ; preserve a2
  730.         move.l    #buff3,d0
  731.         add.l    (pixels2-mybltnode,a1),d0
  732.         add.l    (pixels4-mybltnode,a1),d0
  733.         subq.l    #2,d0
  734.         move.l    d0,(bltbpt,a0)        ; buff3+6*pixels/8-2
  735.         sub.l    (pixels8-mybltnode,a1),d0
  736.         move.l    d0,(bltapt,a0)        ; buff3+5*pixels/8-2
  737.         move.l    (planes-mybltnode,a1),a2
  738.         move.l    (4*4,a2),d0
  739.         add.l    (offset-mybltnode,a1),d0
  740.         add.l    (pixels8-mybltnode,a1),d0
  741.         subq.l    #2,d0
  742.         move.l    d0,(bltdpt,a0)        ; Plane4+offset+plsiz-2
  743.         move.w    #1,(bltsizh,a0)        ;plane 4
  744.         lea    (blit40,pc),a0
  745.         move.l    a0,(qblitfunc-mybltnode,a1)
  746.         move.l    d1,a2            ; restore a2
  747.         rts
  748.  
  749. ;-------------------------------------------------
  750. ;Plane4        a4b4c4d4e4f4g4h4 i4j4k4l4m4n4o4p4
  751. ;Plane4+2    q4r4s4t4u4v4w4x4 y4z4A4B4C4D4E4F4
  752. ;-------------------------------------------------
  753.  
  754. ;Pass 4, plane 0
  755. ;    apt        buff3+7*pixels/8-2
  756. ;    bpt        buff3+8*pixels/8-2
  757. ;    dpt        Plane0+plsiz-2+offset
  758. ;    amod        0
  759. ;    bmod        0
  760. ;    dmod        0
  761. ;    cdat        $aaaa
  762. ;    sizv        pixels/16
  763. ;    sizh        1 word
  764. ;    con        D=(A<<1)C+B~C, descending
  765.  
  766. blit40:        move.l    a2,d1            ; preserve a2
  767.         move.l    #buff3,d0
  768.         add.l    (pixels-mybltnode,a1),d0
  769.         subq.l    #2,d0
  770.         move.l    d0,(bltbpt,a0)        ; buff3+8*pixels/8-2
  771.         sub.l    (pixels8-mybltnode,a1),d0
  772.         move.l    d0,(bltapt,a0)        ; buff3+7*pixels/8-2
  773.         move.l    (planes-mybltnode,a1),a2
  774.         move.l    (a2),d0
  775.         add.l    (offset-mybltnode,a1),d0
  776.         add.l    (pixels8-mybltnode,a1),d0
  777.         subq.l    #2,d0
  778.         move.l    d0,(bltdpt,a0)        ; Plane0+offset+plsiz-2
  779.         move.w    #1,(bltsizh,a0)        ;plane 0
  780.         lea    (blit31,pc),a0
  781.         move.l    a0,(qblitfunc-mybltnode,a1)
  782.         move.l    d1,a2            ; restore a2
  783.         moveq    #0,d0            ; set Z flag
  784.         rts
  785.  
  786. ;-------------------------------------------------
  787. ;Plane0        a0b0c0d0e0f0g0h0 i0j0k0l0m0n0o0p0
  788. ;Plane0+2    q0r0s0t0u0v0w0x0 y0z0A0B0C0D0E0F0
  789. ;-------------------------------------------------
  790.  
  791. qblitcleanup:    movem.l    a2/a6,-(sp)
  792.         move.l    #mybltnode,a2
  793.         move.l    (task-mybltnode,a2),a1    ; signal QBlit() has finished
  794.         move.l    (signals2-mybltnode,a2),d0
  795.         move.l    (4).w,a6
  796.         jsr    (_LVOSignal,a6)        ; may be called from interrupts
  797.         movem.l    (sp)+,a2/a6
  798.         rts
  799.  
  800. ;-----------------------------------------------------------------------------
  801.         section    data,data
  802.  
  803.         quad
  804. mybltnode:    dc.l    0        ; next bltnode
  805. qblitfunc:    dc.l    blit31        ; ptr to qblitfunc()
  806.         dc.b    cleanup        ; stat
  807.         dc.b    0        ; filler
  808.         dc.w    0        ; blitsize
  809.         dc.w    0        ; beamsync
  810.         dc.l    qblitcleanup    ; ptr to qblitcleanup()
  811.  
  812.         quad
  813. chunky:        dc.l    0        ; ptr to original chunky data
  814. planes:        dc.l    0        ; ptr to list of output plane ptrs
  815. pixels:        dc.l    0        ; width*height
  816. pixels2:    dc.l    0        ; width*height/2
  817. pixels4:    dc.l    0        ; width*height/4
  818. pixels8:    dc.l    0        ; width*height/8
  819. pixels16:    dc.l    0        ; width*height/16
  820. offset:        dc.l    0        ; byte offset into plane
  821. task:        dc.l    0        ; ptr to this task
  822. signals1:    dc.l    0        ; signals to Signal() after pass 3
  823. signals2:    dc.l    0        ; signals to Signal() at cleanup
  824. gfxbase:    dc.l    0        ; GfxBase
  825. xlate:        dc.l    0
  826. force_update:    dc.w    0
  827.  
  828. ;-----------------------------------------------------------------------------
  829.         section    segment1,bss,chip        ; MUST BE IN CHIP !!!!!
  830.  
  831. buff2        ds.b    maxpixels    ;Intermediate buffer 2
  832. buff3        ds.b    maxpixels    ;Intermediate buffer 3
  833.  
  834. ;-----------------------------------------------------------------------------
  835.  
  836.         end
  837.